package main

import "fmt"

// 字符串数组切片的应用
func main() {
	//1、从字符串生成字节切片
	s := "您好"
	for i, c := range s {
		fmt.Printf("%d %c\n", i, c)
	}

	//2、获取字符串的某一部分
	s2 := "hello 美好新世界！"
	//在 Go 中，字符串是 UTF-8 编码的字节序列，因此直接使用索引操作可能会导致问题，特别是在处理包含中文等非 ASCII 字符的字符串时。每个中文字符占多个字节，所以简单的切片可能会截断字符，导致乱码
	fmt.Println(s2[6:8]) //output �
	r := []rune(s2)
	fmt.Println(string(r[6:8])) //output 美好
	//在内存中，一个字符串实际上是一个双字结构，即一个指向实际数据的指针和记录字符串长度的整数

	//3、修改字符串中的某个字符
	//Go 语言中的字符串是不可变的，也就是说 str[index] 这样的表达式是不可以被放在等号左侧的
	//s2[1] = 'E' //编译不通过；Cannot assign to s2[1]
	//但是可以通过将字符串转换为字节数组，然后修改字节数组中的元素，最后将字节数组转换回字符串来实现修改字符串中的某个字符
	c := []byte(s2)
	c[1] = 'E'
	fmt.Println(string(c)) //output hEllo 美好新世界！
}
